package com.ruc.deke.utils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruc.deke.model.DBRecord;

/**
 * 用于将查询集进行转换
 * 
 * @author: cyj
 * @date: 2017年3月29日 下午4:04:30
 */
public class ParseUtil {

	/**
	 * 将查询集封装到DBRecord对象中,返回一个对象数组
	 * 
	 * @param resultSet
	 *            查询结果集
	 * @return
	 * @author: cyj
	 * @date: 2017年3月29日 下午4:05:20
	 */
	public static ArrayList<DBRecord> toDBRecord(ResultSet resultSet) {
		ArrayList<DBRecord> recordLists = new ArrayList<DBRecord>();

		try {
			if (!resultSet.next()) {
				throw new Exception("Record has't found!");
			}
			int count = resultSet.getMetaData().getColumnCount();
			do {
				DBRecord singRecord = new DBRecord();

				for (int i = 1; i < (count + 1); i++) {
					String strValue = "";

					/****** 通过结果集获取字段名称,字段类型 ******/
					String strColumnName = resultSet.getMetaData().getColumnName(i).toUpperCase();
					String type = resultSet.getMetaData().getColumnTypeName(i).toLowerCase();
					/**
					 * 对数据类型判断， 根据不同的数据类型对应不同的数据接收方式
					 **/
					if (type == null) {
						strValue = resultSet.getString(strColumnName);
					} else if (type.equalsIgnoreCase(DataType.NVARCHAR) || type.equalsIgnoreCase(DataType.VARCHAR)
							|| type.equalsIgnoreCase(DataType.CHAR) || type.equalsIgnoreCase(DataType.VARCHAR2)) {
						strValue = resultSet.getString(strColumnName);
					} else if (type.equalsIgnoreCase(DataType.INTEGER) || type.equalsIgnoreCase(DataType.NUMBER)
							|| type.equalsIgnoreCase(DataType.INT) || type.equalsIgnoreCase(DataType.INT2)
							|| type.equals(DataType.SMALLINT)) {
						strValue = resultSet.getInt(strColumnName) + "";

					} else if (type.equalsIgnoreCase(DataType.FLOAT)) {
						strValue = resultSet.getFloat(strColumnName) + "";
					} else if (type.equalsIgnoreCase(DataType.DATE) || type.equalsIgnoreCase(DataType.DATE2)) {
						strValue = resultSet.getDate(strColumnName) + "";
					} else if (type.equalsIgnoreCase(DataType.DOUBLE)) {
						strValue = resultSet.getDouble(strColumnName) + "";
					} else {
						strValue = resultSet.getObject(strColumnName) + "";
					}

					if (strValue != null) {
						strColumnName = strColumnName.toUpperCase();
						singRecord.setField(strColumnName, strValue);
					}
				}

				if (!singRecord.isEmpty()) {
					recordLists.add(singRecord);
				}
			} while (resultSet.next());

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return recordLists;

	}

	/**
	 * 将DBRecord信息转换成==插入==的sql语句
	 * 
	 * @param tableName
	 *            表名
	 * @param arrField
	 *            字段名列表
	 * @param record
	 *            字段名和字段值的键值队
	 * @return String 插入数据库记录操作的SQL语句
	 * @throws Exception
	 */
	public static String toInsertSQL(String tableName, DBRecord record) throws Exception {
		String query = "";

		try {
			/*** 初始化SQL语句存放容器 ***/
			StringBuffer querys = new StringBuffer();
			Enumeration<?> enumKeys = record.keys();
			String columns = ""; // 存贮字段名称容器
			String values = ""; // 存贮字段名对应的值容器

			/****** 从Properties中获得键值列表 *******/
			while (enumKeys.hasMoreElements()) {
				String key = (String) enumKeys.nextElement();
				String value = (String) record.getField(key);
				columns += key + ",";
				if (key.equalsIgnoreCase("op_time")) {
					values += "TO_DATE('" + value + "','YYYY-MM-DD HH24:MI:SS')" + ",";
				} else {
					values += "'" + value + "',";
				}
			}

			/*************** 生成insert SQL语句 ******************/
			querys.append("INSERT INTO " + tableName + "(");

			/****** 遍历列名列表，将列名存入StringBuffer中 *********/
			int iLenC = columns.length();
			int iLenV = values.length();

			/***** 去掉最后的',' *****/
			columns = columns.substring(0, iLenC - 1);
			values = values.substring(0, iLenV - 1);
			querys.append(columns + " ) VALUES ( " + values + " ) ");
			query = querys.toString();
		} catch (Exception e) {
			throw new Exception("Error executing SQL" + query + e.toString());
		}
		return query;
	}

	/**
	 * 生成==更新==数据库记录操作的SQL语句
	 * 
	 * @param tableName
	 *            表名
	 * @param values
	 *            新的记录值
	 * @param conds
	 *            更新的条件列表
	 * @return String 更新数据库记录操作的SQL语句
	 * @throws Exception
	 */
	public static String toUpdataSQL(String tableName, DBRecord values, DBRecord conds) throws Exception {
		String query = "";
		String update = "";
		String where = "";

		try {
			/*************** 生成update SQL语句 ******************/

			StringBuffer querys = new StringBuffer();

			querys.append("UPDATE " + tableName + " SET ");

			/****** 从Properties中获得键值列表 *******/

			/******
			 * 遍历列名和列值列表， 将列名和对应列值存入StringBuffer中
			 ******/

			update = BuildupString.getCols(values, ",");
			where = BuildupString.getCols(conds);

			if (where == null || where.trim().length() <= 0) {
				querys.append(update + where);

			} else {
				querys.append(update + " WHERE " + where);
			}

			query = querys.toString();
		} catch (Exception e) {
			throw new Exception("Error executing SQL : " + query + e.toString());
		}
		return query;
	}

	/**
	 * 将一个字符串转换成java对象
	 * 
	 * @return
	 * @author: cyj
	 * @date: 2017年3月30日 下午3:11:43
	 */
	public static Object toObject(String string) {
		string = "{ value : '" + string + "' } ";
		JSONObject object = JSON.parseObject(string);
		return object;
	}

}
